# -*- coding: utf-8 -*-
#Importamos las librerias que vamos a utilizar a lo largo del trabajo
import copy#Archivo de copia de elementos para creacion de sucesores sin modificar a elementos base
import config as c#Archivo de configuracion de parametros y funciones axuliares

##
#Creamos clases fundamentales para contener los datos que utilizaremso a lo largo del proyecto
class cartera(): #Clase Cartera la cual se encarga de contener los prestamos...
    def __init__(self): #Al instanciarla
        self.prestamos= {} #Inicia el diccionario de prestamos
    def mod_cartera(self, prestamo):#Funcion nativa para realizar copia, permitiendo modificar diccionario de la copia, sin que afecte la base...
        nueva = cartera()#Instancia una nueva cartera
        nueva.prestamos= copy.copy(self.prestamos)#Hace copia superficial del diccionario
        if prestamo.id_prestamo in nueva.prestamos.keys(): del nueva.prestamos[prestamo.id_prestamo]#Si el prestamo existia, lo elimina
        else: nueva.prestamos[prestamo.id_prestamo]= prestamo#Si no lo agrega
        return nueva#Devuelve la cartera nueva
    def valor_total(self):#Funcion encargada de calcular el valor actual de toda la cartera a partir de los prestamos que contiene...
        return sum([p.valor_actual for p in self.prestamos.values()])#List comprehession que se encarga de recorrer prestamos y armar valor total
    def agregar_prestamo(self, prestamo): #Funcion encargada de sumar un prestamo a la cartera
        if prestamo.id_prestamo not in self.prestamos.keys(): self.prestamos[prestamo.id_prestamo]= prestamo#Si el prestamo, no esta lo agrega
    def quitar_prestamo(self, prestamo): #Funcion encargada de quitar un prestamo de la cartera
        if prestamo.id_prestamo in self.prestamos.keys(): del self.prestamos[prestamo.id_prestamo]#Si el prestamo esta, lo elimina
    def calcular_preferencias(self, clientes):#Se encarga de calcular en un proceso batch la preferencia de todos los prestamos de la cartera cuando se la llama
        for p in self.prestamos.values(): p.preferencia= (100* (p.id_cliente in clientes)) + (100 - (25 * (p.mora[0] - 1))) + [0,0,0,0,-400,-400][p.mora[1]] + (100 - (25 * int(p.refinanciamientos)))
    def calidad(self, cartera_remplazar):#devuelve la calidad de la cartera auditada
        return int((((self.valor_total() - cartera_remplazar.valor_total()) * c.coef_va) + (c.prom([p.preferencia for p in self.prestamos.values()]))))
    

class prestamo(): #Clase prestamo, este intentara almacenar toda la informacion que necesitamos ya calculada...
    def __init__(self, cuotas, id_prestamo, id_cliente, mora, refinanciamientos):#Funcion constructora de prestamo
        self.id_prestamo= int(id_prestamo)#Id del prestamo transformada a integer
        self.id_cliente= int(id_cliente)#Id del cliente transformada a integer
        self.mora= (int(mora[0]),int(mora[1])) #Mora es una tupla donde en [0]=Situacion actual, [1]=Peor situacion
        self.refinanciamientos= int(refinanciamientos)#cantidad de refinanciamientos
        self.cuotas= cuotas #Guardamos la lista de cuotas por las dudas... 
        self.valor_actual= sum([cuota[1]/((1 + c.tna / c.dias)**(cuota[0] - c.fecha_corte).days) for cuota in cuotas])#Obtiene el valor actual a partir de las cuota
